home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / libcs / movefile.c < prev    next >
C/C++ Source or Header  |  1995-06-12  |  4KB  |  101 lines

  1. /*
  2.  * Copyright (c) 1990 Carnegie Mellon University
  3.  * All Rights Reserved.
  4.  * 
  5.  * Permission to use, copy, modify and distribute this software and its
  6.  * documentation is hereby granted, provided that both the copyright
  7.  * notice and this permission notice appear in all copies of the
  8.  * software, derivative works or modified versions, and any portions
  9.  * thereof, and that both notices appear in supporting documentation.
  10.  *
  11.  * THE SOFTWARE IS PROVIDED "AS IS" AND CARNEGIE MELLON UNIVERSITY
  12.  * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
  13.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO EVENT
  14.  * SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE FOR ANY SPECIAL, DIRECT,
  15.  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
  16.  * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
  17.  * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  18.  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  19.  *
  20.  * Users of this software agree to return to Carnegie Mellon any
  21.  * improvements or extensions that they make and grant Carnegie the
  22.  * rights to redistribute these changes.
  23.  *
  24.  * Export of this software is permitted only after complying with the
  25.  * regulations of the U.S. Deptartment of Commerce relating to the
  26.  * Export of Technical Data.
  27.  */
  28. /*  movefile  --  change name of file
  29.  *
  30.  *  Usage:  int movefile (oldname,newname);
  31.  *    char *oldname,*newname;
  32.  *
  33.  *  Movefile attempts to change the name of a file.
  34.  *  It tries to perform link and unlink, since this is
  35.  *  the fastest way to rename a file.  However, this
  36.  *  will fail in certain circumstances (e.g. if the old and
  37.  *  new names specify different mounted devices).  So, if
  38.  *  the link/unlink fails, movefile will perform opens
  39.  *  and make a fast copy of the file using filecopy.
  40.  *
  41.  *  If movefile is successful, the original file will be
  42.  *  unlinked (removed), and the new file will have the
  43.  *  same mode as the original.  Movefile will return a 0.
  44.  *  If unsuccessful, the original file will remain, but
  45.  *  any file with the same name as the desired file will
  46.  *  be deleted.
  47.  *  Movefile will return -1 if unsuccessful.
  48.  *
  49.  *  Movefile is useful for any program which creates a temporary
  50.  *  file, then wishes to overwrite (or create) another file
  51.  *  using that temp file.
  52.  *
  53.  *  HISTORY
  54.  * $Log:    movefile.c,v $
  55.  * Revision 1.2  90/12/11  17:57:02  mja
  56.  *     Add copyright/disclaimer for distribution.
  57.  * 
  58.  * 03-Jun-85  Steven Shafer (sas) at Carnegie-Mellon University
  59.  *    Changed for 4.2 BSD UNIX to use new rename() and open() calls.
  60.  *    Name changed from "rename" to "movefile" to avoid conflict with
  61.  *    new rename() system call.
  62.  *
  63.  * 18-Feb-83  Steven Shafer (sas) at Carnegie-Mellon University
  64.  *    Fixed bug in call to "link" which prevented it from ever working.
  65.  *
  66.  * 10-Dec-79  Steven Shafer (sas) at Carnegie-Mellon University
  67.  *    Created.
  68.  *
  69.  */
  70.  
  71. #include "sys/types.h"
  72. #include "sys/stat.h"
  73. #include "sys/file.h"
  74.  
  75. int movefile (from,to)
  76. char *from, *to;
  77. {
  78.     register int f,t;    /* file descriptors */
  79.     register int x;        /* system call status */
  80.     struct stat statbuf;    /* for old file mode */
  81.  
  82.     if (rename(from,to) >= 0) {    /* link successful */
  83.         return (0);
  84.     }
  85.  
  86.     x = stat (from,&statbuf);    /* we need the old file mode */
  87.     if (x<0)    return (-1);
  88.  
  89.     f = open (from,0);    /* read original */
  90.     if (f<0)    return (-1);
  91.     t = open (to,(O_WRONLY|O_CREAT|O_TRUNC),statbuf.st_mode & 07777);    /* create dest. file */
  92.     if (t<0)    {close(f);    return (-1);}
  93.  
  94.     x = filecopy (f,t);        /* fast file copy */
  95.  
  96.     close (f);
  97.     close (t);
  98.     if (x >= 0)    unlink (from);
  99.     return (x);
  100. }
  101.